﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LiveCPEWinForm.LiveCPEWS;

namespace LiveCPEWinForm.Gestionnaire
{
	public class GestFriend
	{
        // Evenement sur le chargement des Friends
        public delegate void FriendsLoaded(object sender, EventArgs e);
        public event FriendsLoaded OnFriendRefresh;
        // Fonction local
        protected virtual void OnLoaded()
        {
            EventArgs evt = new EventArgs();
            if (OnFriendRefresh != null)
                OnFriendRefresh(this, evt);
        }
        // Gestionnaire d'application
        private GestAPP lGestAPP;
        // Liste d'amis
        private List<UserWS> lListFriend;
	    public List<UserWS> ListFriend
	    {
		    get { return lListFriend;}
		    set { lListFriend = value;}
	    }
        // Liste de non Amis
        private List<UserWS> lListNoFriend;
        public List<UserWS> ListNoFriend
        {
            get { return lListNoFriend; }
            set { lListNoFriend = value; }
        }
        // Constructeur
        public GestFriend(GestAPP pGestAPP)
        {
            lGestAPP = pGestAPP;
            // Creation des listes
            lListFriend = new List<UserWS>();
            lListNoFriend = new List<UserWS>();
            // Evenement Assynch
            lGestAPP.Service.getFriendsCompleted += new EventHandler<getFriendsCompletedEventArgs>(Service_getFriendsCompleted);
            lGestAPP.Service.getAllUsersCompleted += new EventHandler<getAllUsersCompletedEventArgs>(Service_getAllUsersCompleted);
        }
        // Mise à jour des listes
        public void UpdateFriend()
        {
            // Suppression dans liste
            lListFriend.Clear();
            // Lien WS
            lGestAPP.Service.getFriendsAsync();
           
        }
        // Fin de récupération des amis
        void Service_getFriendsCompleted(object sender, getFriendsCompletedEventArgs e)
        {
            lListFriend.Clear();
            try
            {
                foreach (UserWS usr in e.Result)
                {
                    // Chargement de l'image
                    try
                    {
                        usr.Picture = lGestAPP.Service.GetUserPictureByUser(usr.UserName);
                    }
                    catch (Exception) { }
                    // Ajout à la liste
                    lListFriend.Add(usr);
                }
                // Chargement de liste des non amis
                lGestAPP.Service.getAllUsersAsync();
            }
            catch (Exception) { }
        }
        void Service_getAllUsersCompleted(object sender, getAllUsersCompletedEventArgs e)
        {
            lListNoFriend.Clear();
            try
            {
                foreach (UserWS usr in e.Result)
                {
                    bool isIn = false;
                    foreach (UserWS frd in lListFriend)
                    {
                        // Si l'utilisateur existe déjà
                        if (frd.UserName == usr.UserName)
                            isIn = true;
                    }
                    if (!isIn)
                    {
                        // Chargement de l'image
                        try
                        {
                            usr.Picture = lGestAPP.Service.GetUserPictureByUser(usr.UserName);
                        }
                        catch (Exception) {
                            usr.Picture = new Byte[0];
                        }
                        lListNoFriend.Add(usr);
                    }
                }
            }
            catch (Exception) { }
            // Fire Event
            OnLoaded();
        }
        public string AddFriend(String pUsername)
        {
            String res = lGestAPP.Service.AddFriend(pUsername);
            UpdateFriend();
            return res;
        }
        public string AcceptFriend(String pMessageId)
        {
            String res = lGestAPP.Service.AcceptFriend(pMessageId);
            UpdateFriend();
            return res;
        }
        public String RejectFriend(String pMessageId)
        {
            String res = lGestAPP.Service.RejectFriend(pMessageId);
            UpdateFriend();
            return res;
        }

	}
}
